Monte Carlo simulations are a class of computational algorithms that rely on repeated random sampling to obtain numerical results. They are particularly useful for understanding the behavior of systems too complex for analytical solutions. In this blog post, we’ll explore how to visualize Monte Carlo simulations using R, with the help of the gganimate, tidyverse, gridExtra, and magick packages.

Several notes:

When using gganimate, the gifski renderer is not consistent. It may miss frames from to time. It appears the most consistent way of generating animation is - Use transistion_manual - Use file_renderer to generate PNG files - Review PNG files, edit as needed. - Generate gif with magick package. ## Setting the Scene To ensure reproducibility, we set a seed for R’s random number generator. We also define the precision of our output for clarity and consistency.

Case Study - Tolerance Analysis.

In this example, we use a statistical tolerance analysis of the voltage divider as an example.

Voltage Divider The voltage division ratio \(G = \frac{R1}{R1 + R2}\), where \(R_1\) and \(R_2\) are independent variables following normal distributions. Our goal is to simulate this process a million times and visualize the distribution of G.

N_SIM <- 1e6
mcHist <- tibble(R1 = rnorm(N_SIM, 1, 0.04/12),
                R2 = rnorm(N_SIM, 1, 0.04/12)) %>%
  mutate(G = R1 /(R1+R2)) %>% 
  mutate(index = row_number()) %>% 
  pivot_longer(cols = c("R1", "R2", "G"),
               names_to = "Variable", 
               values_to = "value") %>% 
  mutate(round = if_else(Variable == "G", 
                             plyr::round_any(value, 5e-4),
                             plyr::round_any(value, 1e-3)))

Create Frequency Table

count_by_round <-mcHist %>%
  select(Variable, round) %>%
  group_by(Variable, round) %>%
  summarise(n = n(), .groups = "drop") %>%
  ungroup()

gplot <- count_by_round %>%
  filter(Variable == "G") %>% 
  ggplot(aes(round, n)) +
  facet_grid(~Variable) +
  geom_bar(stat = "identity", color="black") + 
  geom_vline(xintercept = 0.49, color="blue") + 
  geom_vline(xintercept = 0.51, color="blue") +
  theme_bw() + 
  theme(strip.text = element_text(size = 16, hjust = 0.1),
        axis.text.y = element_blank(),
        axis.text.x = element_text(angle=90, vjust=.5, hjust=1))

rplot <- count_by_round %>%
  filter(Variable != "G") %>% 
  ggplot(aes(round, n)) +
  facet_grid(~Variable) +
  geom_bar(stat = "identity", color="black") + 
  geom_vline(xintercept = 0.98, color="blue") + 
  geom_vline(xintercept = 1.02, color="blue") +
  theme_bw() + 
  theme(strip.text = element_text(size = 16, hjust = 0.1),
        axis.text.y = element_blank(),
        axis.text.x = element_text(angle=90, vjust=.5, hjust=1))

Combine Plots

# Combine plots
plot = grid.arrange(rplot, gplot, nrow = 2)

# alternatively, use geom_bar to generate histogram from raw data
gg <- mcHist %>%
  filter(Variable == "G") %>%
  ggplot(aes(x=round)) + 
  geom_bar(color="black", stat = "count", alpha = .3, fill = "transparent") +
  labs(x = "", y = "Frequency") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        strip.text = element_text(size = 16, hjust = 0.1),
        axis.text.y = element_blank()) +
  geom_vline(xintercept = 0.49, color="blue") + geom_vline(xintercept = 0.51, color="blue")

gg

Animating the Simulation

Animations can provide a dynamic view of the simulation process. Here, we’ll create several animations to illustrate different aspects of the Monte Carlo simulation. Preparation Slice the simulated data into (N_Frames — 1) slices, where the first frame has zero simulations.

# constants for animation
FPS = 10
N_FRAME = 201
count_by_index <- function(mcHist, nframes=120) {
  # Initialization of variables
  data <- tibble(idx = integer(),
                 n_sample = integer(),
                 Variable = character(),
                 round = numeric(),
                 n = integer())
  N_SIM = max(mcHist$index)
  step <- floor(N_SIM / (nframes-1))
  data <- data %>% 
    add_row(tibble(idx = 1,
                 n_sample = 0,
                 Variable = c("G","R1", "R2"),
                 round = c(0.5, 1.0, 1.0),
                 n = 0))

  for (i in 1:nframes-1) {
    # Data manipulation and summarization steps
    row <- mcHist %>%
           select(index, Variable, round) %>%
           filter(index <= step * i) %>%
           group_by(Variable, round) %>%
           summarise(n = n(), .groups = 'drop') %>%
           mutate(idx = i + 1,
                  n_sample = floor(step * i))
    # Append the summary data to the main data frame
    data <- data %>%
            add_row(row)
  }
  return(data)
}
hist_anim_data <- count_by_index(mcHist, N_FRAME) %>% 
  arrange(idx)

Create Text for G and R

In this section, we will create a text gif to demonstrate the concept of a transfer function, which takes values of x to generate corresponding values of y.

textplot_data <- mcHist %>% 
  filter(index<=5) %>% 
  arrange(index, Variable)
# dot plot for first 5 samples 
tgplot <- textplot_data %>%
  filter(Variable == "G") %>%
  ggplot(aes(group = index, x = round)) + # group by index is important
  facet_grid(~Variable) +
  geom_point(aes(y=0), size = 5, color="black") + 
  geom_text(aes(x=0.5, y=0.1, label = round), 
                position = position_dodge(width=0.9), color="blue", size = 10) +
  labs(x = "", y = "Frequency") +
  xlim(0.49, 0.51) +
  theme_bw() +
  theme(panel.grid = element_blank(),
    strip.text = element_text(size = 16, hjust = 0.1),
    axis.text.y = element_blank()) 

trplot <- textplot_data %>%
  filter(Variable != "G") %>%
  ggplot(aes(group = index, x = round)) + # group by index is important
  facet_grid(~Variable) +
  geom_point(aes(y=0), size = 5, color="black") + 
  geom_text(aes(x=1, y=0.1, label = round), 
                position = position_dodge(width=0.9), color="blue", size = 10) +
  labs(x = "", y = "Frequency") +
    xlim(0.98, 1.02) +
    theme_bw() +
    theme(
      panel.grid = element_blank(),
      strip.text = element_text(size = 16, hjust = 0.1),
      axis.text.y = element_blank()
    )

Create GIF

Use transition_manual(frames = index) all through to avoid frames misalignment when using transition_states(states = Time)

# Create GIF
r_anim <- trplot + transition_manual(frames = index) 
rgif <- animate(r_anim,
                width = 800, height = 300,
                nframes = 5, 
                fps = 2.5,
                #renderer = magick_renderer()
                renderer = gifski_renderer("./anim/tr.gif")
                # renderer = file_renderer("./frames", prefix = "tr")
                )

Rendering [=======================================================================================] at 23 fps ~ eta:  0s
                                                                                                                        
g_anim <- tgplot + transition_manual(frames = index)
ggif <- animate(g_anim,
                width = 800, height = 300,
                nframes = 5,
                fps = 2.5,
                renderer = gifski_renderer("./anim/tg.gif")
                # renderer = magick_renderer()
                # renderer = file_renderer("./frames", prefix = "tg")
                )

Combine 2 gifs

stack2gif <- function(gif1, gif2, n_frames){
  # read gif as imageck format 
  a_mgif <- image_read(gif1) 
  b_mgif <- image_read(gif2)
  new_gif <- image_append(c(a_mgif[1], b_mgif[1]), stack = TRUE)
  for(i in 2:n_frames) {
    combined <- image_append(c(a_mgif[i], b_mgif[i]), stack = TRUE)
    new_gif <- c(new_gif, combined)
    }
return(new_gif)  

a_mgif <- image_read(rgif)
b_mgif <- image_read(ggif)
new_gif <- image_append(c(a_mgif[1], b_mgif[1]), stack = TRUE)
for(i in 2:5) {
  combined <- image_append(c(a_mgif[i], b_mgif[i]), stack = TRUE)
  new_gif <- c(new_gif, combined)
}
anim_save("./anim/5dots.gif", new_gif)

}

The created gif: animated dot

Create dot histogram

In this section, we create a histogram gif, where each dot represent one data point.

first_n = 100

count_data_n <- mcHist %>% 
  filter(index <= first_n) %>% 
  arrange(index, Variable) %>% 
  group_by(Variable, round) %>% 
  mutate(y = seq_along(round))

fg_plot <- count_data_n %>%
  filter(Variable == "G") %>%
  ggplot(aes(group = index, round, y)) + # group by index is important
  facet_grid(~Variable) +
  geom_point(size = 2) +
  labs(x = "", y = "Frequency") +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    strip.text = element_text(size = 32, hjust = 0.1),
    axis.text.y = element_blank()
  )

plot2frames <- function(plot, 
                     prefix, 
                     w = 800, h = 300,
                     path_frames = "./frames"
                     ){
  anim <- plot + transition_manual(index, cumulative = TRUE)
  gif <- animate(
    anim,
    width = w,
    height = h,
    renderer = file_renderer(path_frames, prefix = prefix)
  )
  return(gif)
} 


fg_anim <- plot2frames(fg_plot, prefix = "gdot")

Rendering [======>--------------------------------------------------------------------------------] at 36 fps ~ eta:
3s
Rendering [=======>-------------------------------------------------------------------------------] at 36 fps ~ eta:
3s
Rendering [========>------------------------------------------------------------------------------] at 36 fps ~ eta:
3s
Rendering [=========>-----------------------------------------------------------------------------] at 36 fps ~ eta:
2s
Rendering [=========>-----------------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [==========>----------------------------------------------------------------------------] at 36 fps ~ eta:
2s
Rendering [===========>---------------------------------------------------------------------------] at 36 fps ~ eta:
2s
Rendering [============>--------------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [=============>-------------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [==============>------------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [===============>-----------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [================>----------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [=================>---------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [==================>--------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [===================>-------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [====================>------------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [=====================>-----------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [======================>----------------------------------------------------------------] at 35 fps ~ eta:
2s
Rendering [=======================>---------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [========================>--------------------------------------------------------------] at 29 fps ~ eta:
2s
Rendering [=========================>-------------------------------------------------------------] at 29 fps ~ eta:
2s
Rendering [==========================>------------------------------------------------------------] at 29 fps ~ eta:
2s
Rendering [===========================>-----------------------------------------------------------] at 29 fps ~ eta:
2s
Rendering [============================>----------------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=============================>---------------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=============================>---------------------------------------------------------] at 29 fps ~ eta:
2s
Rendering [==============================>--------------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [===============================>-------------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [================================>------------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=================================>-----------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [==================================>----------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [===================================>---------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [====================================>--------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=====================================>-------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [======================================>------------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=======================================>-----------------------------------------------] at 30 fps ~ eta:
2s
Rendering [========================================>----------------------------------------------] at 30 fps ~ eta:
2s
Rendering [=========================================>---------------------------------------------] at 31 fps ~ eta:
2s
Rendering [==========================================>--------------------------------------------] at 31 fps ~ eta:
2s
Rendering [===========================================>-------------------------------------------] at 31 fps ~ eta:
2s
Rendering [============================================>------------------------------------------] at 31 fps ~ eta:
2s
Rendering [=============================================>-----------------------------------------] at 31 fps ~ eta:
2s
Rendering [==============================================>----------------------------------------] at 31 fps ~ eta:
1s
Rendering [===============================================>---------------------------------------] at 31 fps ~ eta:
1s
Rendering [================================================>--------------------------------------] at 31 fps ~ eta:
1s
Rendering [=================================================>-------------------------------------] at 31 fps ~ eta:
1s
Rendering [==================================================>------------------------------------] at 32 fps ~ eta:
1s
Rendering [===================================================>-----------------------------------] at 32 fps ~ eta:
1s
Rendering [====================================================>----------------------------------] at 32 fps ~ eta:
1s
Rendering [=====================================================>---------------------------------] at 32 fps ~ eta:
1s
Rendering [======================================================>--------------------------------] at 32 fps ~ eta:
1s
Rendering [=======================================================>-------------------------------] at 32 fps ~ eta:
1s
Rendering [========================================================>------------------------------] at 32 fps ~ eta:
1s
Rendering [=========================================================>-----------------------------] at 32 fps ~ eta:
1s
Rendering [==========================================================>----------------------------] at 32 fps ~ eta:
1s
Rendering [===========================================================>---------------------------] at 32 fps ~ eta:
1s
Rendering [============================================================>--------------------------] at 32 fps ~ eta:
1s
Rendering [=============================================================>-------------------------] at 32 fps ~ eta:
1s
Rendering [==============================================================>------------------------] at 32 fps ~ eta:
1s
Rendering [===============================================================>-----------------------] at 32 fps ~ eta:
1s
Rendering [================================================================>----------------------] at 32 fps ~ eta:
1s
Rendering [=================================================================>---------------------] at 32 fps ~ eta:
1s
Rendering [==================================================================>--------------------] at 32 fps ~ eta:
1s
Rendering [===================================================================>-------------------] at 32 fps ~ eta:
1s
Rendering [====================================================================>------------------] at 32 fps ~ eta:
1s
Rendering [=====================================================================>-----------------] at 32 fps ~ eta:
1s
Rendering [======================================================================>----------------] at 32 fps ~ eta:
1s
Rendering [=======================================================================>---------------] at 32 fps ~ eta:
1s
Rendering [========================================================================>--------------] at 32 fps ~ eta:
0s
Rendering [=========================================================================>-------------] at 32 fps ~ eta:
0s
Rendering [==========================================================================>------------] at 32 fps ~ eta:
0s
Rendering [===========================================================================>-----------] at 32 fps ~ eta:
0s
Rendering [============================================================================>----------] at 32 fps ~ eta:
0s
Rendering [=============================================================================>---------] at 32 fps ~ eta:
0s
Rendering [==============================================================================>--------] at 32 fps ~ eta:
0s
Rendering [===============================================================================>-------] at 32 fps ~ eta:
0s
Rendering [================================================================================>------] at 32 fps ~ eta:
0s
Rendering [=================================================================================>-----] at 33 fps ~ eta:
0s
Rendering [==================================================================================>----] at 32 fps ~ eta:
0s
Rendering [===================================================================================>---] at 32 fps ~ eta:
0s
Rendering [===================================================================================>---] at 33 fps ~ eta:
0s
Rendering [====================================================================================>--] at 33 fps ~ eta:
0s
Rendering [=====================================================================================>-] at 33 fps ~ eta:
0s
Rendering [=======================================================================================] at 33 fps ~ eta: 0s
Warning: file_renderer failed to copy frames to the destination directory
fr_plot <- count_data_n %>%
  filter(Variable != "G") %>%
  ggplot(aes(group = index, round, y)) + # group by index is important
  facet_grid(~Variable) +
  geom_point(size = 2) +
  labs(x = "", y = "Frequency") +
  theme_bw() +
  theme(
    panel.grid = element_blank(),
    strip.text = element_text(size = 32, hjust = 0.1),
    axis.text.y = element_blank()
  )


fg_anim <- plot2frames(fg_plot, prefix = "gdot")

Rendering [=====>---------------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [======>--------------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [=======>-------------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [========>------------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [=========>-----------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [=========>-----------------------------------------------------------------------------] at 34 fps ~ eta:
3s
Rendering [==========>----------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [===========>---------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [============>--------------------------------------------------------------------------] at 34 fps ~ eta:
3s
Rendering [=============>-------------------------------------------------------------------------] at 33 fps ~ eta:
3s
Rendering [==============>------------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [===============>-----------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [================>----------------------------------------------------------------------] at 33 fps ~ eta:
2s
Rendering [================>----------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=================>---------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [==================>--------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [===================>-------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [====================>------------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=====================>-----------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [======================>----------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=======================>---------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [========================>--------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=========================>-------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [==========================>------------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [===========================>-----------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [============================>----------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=============================>---------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [==============================>--------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [===============================>-------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [================================>------------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=================================>-----------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [==================================>----------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [===================================>---------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [====================================>--------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [====================================>--------------------------------------------------] at 33 fps ~ eta:
2s
Rendering [=====================================>-------------------------------------------------] at 33 fps ~ eta:
2s
Rendering [======================================>------------------------------------------------] at 34 fps ~ eta:
2s
Rendering [=======================================>-----------------------------------------------] at 33 fps ~ eta:
2s
Rendering [========================================>----------------------------------------------] at 33 fps ~ eta:
2s
Rendering [=========================================>---------------------------------------------] at 33 fps ~ eta:
2s
Rendering [==========================================>--------------------------------------------] at 33 fps ~ eta:
2s
Rendering [===========================================>-------------------------------------------] at 33 fps ~ eta:
1s
Rendering [============================================>------------------------------------------] at 33 fps ~ eta:
1s
Rendering [=============================================>-----------------------------------------] at 33 fps ~ eta:
1s
Rendering [==============================================>----------------------------------------] at 33 fps ~ eta:
1s
Rendering [===============================================>---------------------------------------] at 33 fps ~ eta:
1s
Rendering [================================================>--------------------------------------] at 33 fps ~ eta:
1s
Rendering [=================================================>-------------------------------------] at 34 fps ~ eta:
1s
Rendering [==================================================>------------------------------------] at 34 fps ~ eta:
1s
Rendering [===================================================>-----------------------------------] at 34 fps ~ eta:
1s
Rendering [====================================================>----------------------------------] at 34 fps ~ eta:
1s
Rendering [=====================================================>---------------------------------] at 34 fps ~ eta:
1s
Rendering [======================================================>--------------------------------] at 34 fps ~ eta:
1s
Rendering [=======================================================>-------------------------------] at 34 fps ~ eta:
1s
Rendering [========================================================>------------------------------] at 33 fps ~ eta:
1s
Rendering [=========================================================>-----------------------------] at 34 fps ~ eta:
1s
Rendering [==========================================================>----------------------------] at 33 fps ~ eta:
1s
Rendering [===========================================================>---------------------------] at 33 fps ~ eta:
1s
Rendering [============================================================>--------------------------] at 33 fps ~ eta:
1s
Rendering [=============================================================>-------------------------] at 33 fps ~ eta:
1s
Rendering [==============================================================>------------------------] at 33 fps ~ eta:
1s
Rendering [===============================================================>-----------------------] at 33 fps ~ eta:
1s
Rendering [================================================================>----------------------] at 33 fps ~ eta:
1s
Rendering [=================================================================>---------------------] at 33 fps ~ eta:
1s
Rendering [==================================================================>--------------------] at 33 fps ~ eta:
1s
Rendering [===================================================================>-------------------] at 33 fps ~ eta:
1s
Rendering [====================================================================>------------------] at 33 fps ~ eta:
1s
Rendering [=====================================================================>-----------------] at 33 fps ~ eta:
1s
Rendering [======================================================================>----------------] at 33 fps ~ eta:
1s
Rendering [=======================================================================>---------------] at 33 fps ~ eta:
1s
Rendering [========================================================================>--------------] at 33 fps ~ eta:
0s
Rendering [=========================================================================>-------------] at 33 fps ~ eta:
0s
Rendering [==========================================================================>------------] at 33 fps ~ eta:
0s
Rendering [===========================================================================>-----------] at 33 fps ~ eta:
0s
Rendering [============================================================================>----------] at 33 fps ~ eta:
0s
Rendering [=============================================================================>---------] at 33 fps ~ eta:
0s
Rendering [==============================================================================>--------] at 33 fps ~ eta:
0s
Rendering [===============================================================================>-------] at 33 fps ~ eta:
0s
Rendering [================================================================================>------] at 33 fps ~ eta:
0s
Rendering [=================================================================================>-----] at 33 fps ~ eta:
0s
Rendering [==================================================================================>----] at 33 fps ~ eta:
0s
Rendering [===================================================================================>---] at 33 fps ~ eta:
0s
Rendering [====================================================================================>--] at 33 fps ~ eta:
0s
Rendering [=====================================================================================>-] at 33 fps ~ eta:
0s
Rendering [=======================================================================================] at 33 fps ~ eta: 0s
Warning: file_renderer failed to copy frames to the destination directory
fr_anim <- plot2frames(fr_plot, prefix = "rdot")

Rendering [===>-----------------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [====>----------------------------------------------------------------------------------] at 25 fps ~ eta:
4s
Rendering [=====>---------------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [======>--------------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [=======>-------------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [========>------------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [=========>-----------------------------------------------------------------------------] at 24 fps ~ eta:
4s
Rendering [==========>----------------------------------------------------------------------------] at 25 fps ~ eta:
4s
Rendering [===========>---------------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [============>--------------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [=============>-------------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [==============>------------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [===============>-----------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [================>----------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [=================>---------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [==================>--------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [===================>-------------------------------------------------------------------] at 25 fps ~ eta:
3s
Rendering [====================>------------------------------------------------------------------] at 22 fps ~ eta:
3s
Rendering [=====================>-----------------------------------------------------------------] at 22 fps ~ eta:
3s
Rendering [======================>----------------------------------------------------------------] at 22 fps ~ eta:
3s
Rendering [======================>----------------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [=======================>---------------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [========================>--------------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [=========================>-------------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [==========================>------------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [===========================>-----------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [============================>----------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [=============================>---------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [==============================>--------------------------------------------------------] at 23 fps ~ eta:
3s
Rendering [===============================>-------------------------------------------------------] at 24 fps ~ eta:
3s
Rendering [================================>------------------------------------------------------] at 24 fps ~ eta:
3s
Rendering [=================================>-----------------------------------------------------] at 24 fps ~ eta:
3s
Rendering [==================================>----------------------------------------------------] at 24 fps ~ eta:
3s
Rendering [===================================>---------------------------------------------------] at 24 fps ~ eta:
2s
Rendering [====================================>--------------------------------------------------] at 24 fps ~ eta:
2s
Rendering [=====================================>-------------------------------------------------] at 24 fps ~ eta:
2s
Rendering [======================================>------------------------------------------------] at 24 fps ~ eta:
2s
Rendering [=======================================>-----------------------------------------------] at 24 fps ~ eta:
2s
Rendering [========================================>----------------------------------------------] at 24 fps ~ eta:
2s
Rendering [=========================================>---------------------------------------------] at 24 fps ~ eta:
2s
Rendering [==========================================>--------------------------------------------] at 24 fps ~ eta:
2s
Rendering [===========================================>-------------------------------------------] at 24 fps ~ eta:
2s
Rendering [============================================>------------------------------------------] at 24 fps ~ eta:
2s
Rendering [=============================================>-----------------------------------------] at 24 fps ~ eta:
2s
Rendering [==============================================>----------------------------------------] at 24 fps ~ eta:
2s
Rendering [===============================================>---------------------------------------] at 24 fps ~ eta:
2s
Rendering [================================================>--------------------------------------] at 24 fps ~ eta:
2s
Rendering [=================================================>-------------------------------------] at 24 fps ~ eta:
2s
Rendering [==================================================>------------------------------------] at 24 fps ~ eta:
2s
Rendering [===================================================>-----------------------------------] at 24 fps ~ eta:
2s
Rendering [====================================================>----------------------------------] at 24 fps ~ eta:
2s
Rendering [=====================================================>---------------------------------] at 24 fps ~ eta:
2s
Rendering [======================================================>--------------------------------] at 24 fps ~ eta:
2s
Rendering [=======================================================>-------------------------------] at 25 fps ~ eta:
1s
Rendering [========================================================>------------------------------] at 24 fps ~ eta:
1s
Rendering [=========================================================>-----------------------------] at 24 fps ~ eta:
1s
Rendering [==========================================================>----------------------------] at 25 fps ~ eta:
1s
Rendering [===========================================================>---------------------------] at 24 fps ~ eta:
1s
Rendering [============================================================>--------------------------] at 24 fps ~ eta:
1s
Rendering [=============================================================>-------------------------] at 24 fps ~ eta:
1s
Rendering [==============================================================>------------------------] at 24 fps ~ eta:
1s
Rendering [===============================================================>-----------------------] at 24 fps ~ eta:
1s
Rendering [================================================================>----------------------] at 24 fps ~ eta:
1s
Rendering [=================================================================>---------------------] at 24 fps ~ eta:
1s
Rendering [==================================================================>--------------------] at 24 fps ~ eta:
1s
Rendering [===================================================================>-------------------] at 24 fps ~ eta:
1s
Rendering [====================================================================>------------------] at 24 fps ~ eta:
1s
Rendering [=====================================================================>-----------------] at 24 fps ~ eta:
1s
Rendering [======================================================================>----------------] at 24 fps ~ eta:
1s
Rendering [=======================================================================>---------------] at 24 fps ~ eta:
1s
Rendering [========================================================================>--------------] at 24 fps ~ eta:
1s
Rendering [=========================================================================>-------------] at 24 fps ~ eta:
1s
Rendering [==========================================================================>------------] at 24 fps ~ eta:
1s
Rendering [===========================================================================>-----------] at 24 fps ~ eta:
1s
Rendering [============================================================================>----------] at 24 fps ~ eta:
0s
Rendering [=============================================================================>---------] at 24 fps ~ eta:
0s
Rendering [==============================================================================>--------] at 24 fps ~ eta:
0s
Rendering [===============================================================================>-------] at 24 fps ~ eta:
0s
Rendering [================================================================================>------] at 24 fps ~ eta:
0s
Rendering [=================================================================================>-----] at 24 fps ~ eta:
0s
Rendering [==================================================================================>----] at 24 fps ~ eta:
0s
Rendering [===================================================================================>---] at 24 fps ~ eta:
0s
Rendering [====================================================================================>--] at 24 fps ~ eta:
0s
Rendering [=====================================================================================>-] at 24 fps ~ eta:
0s
Rendering [=======================================================================================] at 24 fps ~ eta: 0s
Warning: file_renderer failed to copy frames to the destination directory
fn_gif <- stack2gif(fr_anim, fg_anim, first_n) %>% 
  image_animate(
    fps = FPS,
    loop = 0,
  )

anim_save("./anim/fn.gif", fn_gif)

This gif shows how first N simulation accumated to form the historgram. first N

Historgram bar gif

gplot <-
  hist_anim_data %>%
  filter(Variable == "G") %>%
  ggplot(aes(group = idx, round, n)) + # group by index is important
  facet_grid(~Variable) +
  geom_bar(stat = "identity") +
  geom_vline(xintercept = 0.49, color="blue") +
  geom_vline(xintercept = 0.51, color="blue") +
  labs(x = "", y = "Frequency") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        strip.text = element_text(size = 32, hjust = 0.1),
        plot.title = element_text(size = 32, hjust = 0.1),
        axis.text.y = element_blank())

step <- N_SIM / (N_FRAME - 1)
gbar_anim <- gplot + 
    ggtitle('{format(floor((frame - 1) * step), scientific = FALSE, big.mark = "," )} Samples Generated') + 
  transition_manual(frames = idx)
gbar_gif <- animate(gbar_anim,
                    nframes = N_FRAME,
                    width = 800, height = 300,
                    # fps = FPS,
                    # renderer = gifski_renderer("./anim/gbar.gif"),
                    # renderer = magick_renderer()
                    renderer = file_renderer("./frames", prefix = "gbar")
)

Rendering [==>------------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [===>-----------------------------------------------------------------------------------] at 30 fps ~ eta:
6s
Rendering [===>-----------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [====>----------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [====>----------------------------------------------------------------------------------] at 30 fps ~ eta:
6s
Rendering [=====>---------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [=====>---------------------------------------------------------------------------------] at 30 fps ~ eta:
6s
Rendering [======>--------------------------------------------------------------------------------] at 30 fps ~ eta:
6s
Rendering [======>--------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [=======>-------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [========>------------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [=========>-----------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [==========>----------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [===========>---------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [============>--------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [============>--------------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [=============>-------------------------------------------------------------------------] at 31 fps ~ eta:
6s
Rendering [=============>-------------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [==============>------------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [===============>-----------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [================>----------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [=================>---------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [==================>--------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [===================>-------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [====================>------------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [=====================>-----------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [======================>----------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [=======================>---------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [========================>--------------------------------------------------------------] at 31 fps ~ eta:
5s
Rendering [=========================>-------------------------------------------------------------] at 30 fps ~ eta:
5s
Rendering [==========================>------------------------------------------------------------] at 30 fps ~ eta:
5s
Rendering [===========================>-----------------------------------------------------------] at 30 fps ~ eta:
5s
Rendering [============================>----------------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=============================>---------------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [==============================>--------------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [===============================>-------------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [================================>------------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=================================>-----------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [==================================>----------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [===================================>---------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [====================================>--------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=====================================>-------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [======================================>------------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=======================================>-----------------------------------------------] at 30 fps ~ eta:
4s
Rendering [========================================>----------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=========================================>---------------------------------------------] at 30 fps ~ eta:
4s
Rendering [=========================================>---------------------------------------------] at 30 fps ~ eta:
3s
Rendering [==========================================>--------------------------------------------] at 30 fps ~ eta:
3s
Rendering [===========================================>-------------------------------------------] at 30 fps ~ eta:
3s
Rendering [============================================>------------------------------------------] at 30 fps ~ eta:
3s
Rendering [=============================================>-----------------------------------------] at 30 fps ~ eta:
3s
Rendering [==============================================>----------------------------------------] at 30 fps ~ eta:
3s
Rendering [===============================================>---------------------------------------] at 30 fps ~ eta:
3s
Rendering [================================================>--------------------------------------] at 30 fps ~ eta:
3s
Rendering [=================================================>-------------------------------------] at 30 fps ~ eta:
3s
Rendering [==================================================>------------------------------------] at 30 fps ~ eta:
3s
Rendering [===================================================>-----------------------------------] at 30 fps ~ eta:
3s
Rendering [====================================================>----------------------------------] at 30 fps ~ eta:
3s
Rendering [=====================================================>---------------------------------] at 30 fps ~ eta:
3s
Rendering [======================================================>--------------------------------] at 30 fps ~ eta:
3s
Rendering [======================================================>--------------------------------] at 30 fps ~ eta:
2s
Rendering [=======================================================>-------------------------------] at 30 fps ~ eta:
2s
Rendering [========================================================>------------------------------] at 30 fps ~ eta:
2s
Rendering [=========================================================>-----------------------------] at 30 fps ~ eta:
2s
Rendering [==========================================================>----------------------------] at 30 fps ~ eta:
2s
Rendering [===========================================================>---------------------------] at 30 fps ~ eta:
2s
Rendering [============================================================>--------------------------] at 30 fps ~ eta:
2s
Rendering [=============================================================>-------------------------] at 30 fps ~ eta:
2s
Rendering [==============================================================>------------------------] at 30 fps ~ eta:
2s
Rendering [===============================================================>-----------------------] at 30 fps ~ eta:
2s
Rendering [================================================================>----------------------] at 30 fps ~ eta:
2s
Rendering [=================================================================>---------------------] at 30 fps ~ eta:
2s
Rendering [==================================================================>--------------------] at 30 fps ~ eta:
2s
Rendering [===================================================================>-------------------] at 30 fps ~ eta:
2s
Rendering [===================================================================>-------------------] at 30 fps ~ eta:
1s
Rendering [====================================================================>------------------] at 29 fps ~ eta:
1s
Rendering [====================================================================>------------------] at 30 fps ~ eta:
1s
Rendering [=====================================================================>-----------------] at 30 fps ~ eta:
1s
Rendering [=====================================================================>-----------------] at 29 fps ~ eta:
1s
Rendering [======================================================================>----------------] at 29 fps ~ eta:
1s
Rendering [======================================================================>----------------] at 30 fps ~ eta:
1s
Rendering [=======================================================================>---------------] at 30 fps ~ eta:
1s
Rendering [========================================================================>--------------] at 30 fps ~ eta:
1s
Rendering [=========================================================================>-------------] at 30 fps ~ eta:
1s
Rendering [==========================================================================>------------] at 30 fps ~ eta:
1s
Rendering [===========================================================================>-----------] at 29 fps ~ eta:
1s
Rendering [============================================================================>----------] at 29 fps ~ eta:
1s
Rendering [=============================================================================>---------] at 29 fps ~ eta:
1s
Rendering [==============================================================================>--------] at 29 fps ~ eta:
1s
Rendering [===============================================================================>-------] at 29 fps ~ eta:
1s
Rendering [================================================================================>------] at 29 fps ~ eta:
1s
Rendering [================================================================================>------] at 29 fps ~ eta:
0s
Rendering [=================================================================================>-----] at 29 fps ~ eta:
0s
Rendering [==================================================================================>----] at 29 fps ~ eta:
0s
Rendering [===================================================================================>---] at 29 fps ~ eta:
0s
Rendering [====================================================================================>--] at 29 fps ~ eta:
0s
Rendering [=====================================================================================>-] at 29 fps ~ eta:
0s
Rendering [======================================================================================>] at 29 fps ~ eta:
0s
Rendering [=======================================================================================] at 29 fps ~ eta: 0s
Warning: file_renderer failed to copy frames to the destination directory
# anim_save("./anim/gbar.gif", gbar_gif)
### For R1 and R2
rplot <-
  hist_anim_data %>%
  filter(Variable != "G") %>%
  ggplot(aes(group = idx, round, n)) + # group by index is important
  facet_grid(~Variable) +
  geom_bar(stat = "identity") +
  geom_vline(xintercept = 0.98, color="blue") +
  geom_vline(xintercept = 1.02, color="blue") +
  labs(x = "", y = "Frequency") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        strip.text = element_text(size = 32, hjust = 0.1),
        axis.text.y = element_blank())

rbar_anim <- rplot + transition_manual(frames = idx)
rbar_gif <- animate(rbar_anim,
                    nframes = N_FRAME,
                    width = 800, height = 300,
                    # fps = FPS,
                    # renderer = gifski_renderer("./anim/rbar.gif")
                    # renderer = magick_renderer()
                    renderer = file_renderer("./frames", prefix = "rbar")
                    )

Rendering [=>-------------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [==>------------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [===>-----------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [====>----------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [=====>---------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [=====>---------------------------------------------------------------------------------] at 25 fps ~ eta:
8s
Rendering [======>--------------------------------------------------------------------------------] at 25 fps ~ eta:
8s
Rendering [======>--------------------------------------------------------------------------------] at 24 fps ~ eta:
8s
Rendering [=======>-------------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [========>------------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [=========>-----------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [==========>----------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [===========>---------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [============>--------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [=============>-------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [==============>------------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [===============>-----------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [================>----------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [=================>---------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [==================>--------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [===================>-------------------------------------------------------------------] at 24 fps ~ eta:
7s
Rendering [===================>-------------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [====================>------------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [=====================>-----------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [======================>----------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [=======================>---------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [========================>--------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [=========================>-------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [==========================>------------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [===========================>-----------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [============================>----------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [=============================>---------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [==============================>--------------------------------------------------------] at 24 fps ~ eta:
6s
Rendering [==============================>--------------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [===============================>-------------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [================================>------------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [=================================>-----------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [==================================>----------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [===================================>---------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [====================================>--------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [=====================================>-------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [======================================>------------------------------------------------] at 23 fps ~ eta:
5s
Rendering [=======================================>-----------------------------------------------] at 23 fps ~ eta:
5s
Rendering [========================================>----------------------------------------------] at 23 fps ~ eta:
5s
Rendering [=========================================>---------------------------------------------] at 23 fps ~ eta:
5s
Rendering [=========================================>---------------------------------------------] at 23 fps ~ eta:
4s
Rendering [==========================================>--------------------------------------------] at 23 fps ~ eta:
4s
Rendering [===========================================>-------------------------------------------] at 23 fps ~ eta:
4s
Rendering [============================================>------------------------------------------] at 23 fps ~ eta:
4s
Rendering [=============================================>-----------------------------------------] at 23 fps ~ eta:
4s
Rendering [==============================================>----------------------------------------] at 23 fps ~ eta:
4s
Rendering [===============================================>---------------------------------------] at 23 fps ~ eta:
4s
Rendering [================================================>--------------------------------------] at 23 fps ~ eta:
4s
Rendering [=================================================>-------------------------------------] at 23 fps ~ eta:
4s
Rendering [==================================================>------------------------------------] at 23 fps ~ eta:
4s
Rendering [===================================================>-----------------------------------] at 23 fps ~ eta:
4s
Rendering [====================================================>----------------------------------] at 23 fps ~ eta:
3s
Rendering [=====================================================>---------------------------------] at 23 fps ~ eta:
3s
Rendering [======================================================>--------------------------------] at 23 fps ~ eta:
3s
Rendering [=======================================================>-------------------------------] at 23 fps ~ eta:
3s
Rendering [========================================================>------------------------------] at 23 fps ~ eta:
3s
Rendering [=========================================================>-----------------------------] at 23 fps ~ eta:
3s
Rendering [==========================================================>----------------------------] at 23 fps ~ eta:
3s
Rendering [===========================================================>---------------------------] at 23 fps ~ eta:
3s
Rendering [============================================================>--------------------------] at 23 fps ~ eta:
3s
Rendering [=============================================================>-------------------------] at 23 fps ~ eta:
3s
Rendering [==============================================================>------------------------] at 23 fps ~ eta:
2s
Rendering [===============================================================>-----------------------] at 23 fps ~ eta:
2s
Rendering [================================================================>----------------------] at 23 fps ~ eta:
2s
Rendering [=================================================================>---------------------] at 23 fps ~ eta:
2s
Rendering [==================================================================>--------------------] at 23 fps ~ eta:
2s
Rendering [==================================================================>--------------------] at 22 fps ~ eta:
2s
Rendering [===================================================================>-------------------] at 22 fps ~ eta:
2s
Rendering [====================================================================>------------------] at 22 fps ~ eta:
2s
Rendering [=====================================================================>-----------------] at 22 fps ~ eta:
2s
Rendering [======================================================================>----------------] at 22 fps ~ eta:
2s
Rendering [=======================================================================>---------------] at 22 fps ~ eta:
2s
Rendering [========================================================================>--------------] at 22 fps ~ eta:
1s
Rendering [=========================================================================>-------------] at 22 fps ~ eta:
1s
Rendering [==========================================================================>------------] at 22 fps ~ eta:
1s
Rendering [===========================================================================>-----------] at 22 fps ~ eta:
1s
Rendering [============================================================================>----------] at 22 fps ~ eta:
1s
Rendering [=============================================================================>---------] at 22 fps ~ eta:
1s
Rendering [==============================================================================>--------] at 22 fps ~ eta:
1s
Rendering [===============================================================================>-------] at 22 fps ~ eta:
1s
Rendering [================================================================================>------] at 22 fps ~ eta:
1s
Rendering [=================================================================================>-----] at 22 fps ~ eta:
1s
Rendering [=================================================================================>-----] at 22 fps ~ eta:
0s
Rendering [==================================================================================>----] at 22 fps ~ eta:
0s
Rendering [===================================================================================>---] at 22 fps ~ eta:
0s
Rendering [====================================================================================>--] at 22 fps ~ eta:
0s
Rendering [=====================================================================================>-] at 22 fps ~ eta:
0s
Rendering [======================================================================================>] at 22 fps ~ eta:
0s
Rendering [=======================================================================================] at 22 fps ~ eta: 0s
Warning: file_renderer failed to copy frames to the destination directory

Combine 2 gifs

a_mgif <- image_read(rbar_gif)
b_mgif <- image_read(gbar_gif)
# c_mgif <- image_read(counter_gif)

new_gif <- image_append(c(a_mgif[1], b_mgif[1]), stack = TRUE)
for(i in 2:N_FRAME) {
  combined <- image_append(c(a_mgif[i], b_mgif[i]), stack = TRUE)
  new_gif <- c(new_gif, combined)
}
new_gif <- new_gif %>% 
  image_animate(
    fps = FPS,
    loop = 0,
  )

anim_save("./anim/bar.gif", new_gif)

We check the generated gif: Animated Bar

LS0tCnRpdGxlOiAiTW9udGUgQ2FybG8gVmlzdWxpemF0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkobWFnaWNrKQpvcHRpb25zKGRpZ2l0ID0gNikKb2xkIDwtIG9wdGlvbnMocGlsbGFyLnNpZ2ZpZyA9IDcpCnNldC5zZWVkKDQyKQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChldmFsID0gVFJVRSwgZWNobyA9IFRSVUUpCmBgYApNb250ZSBDYXJsbyBzaW11bGF0aW9ucyBhcmUgYSBjbGFzcyBvZiBjb21wdXRhdGlvbmFsIGFsZ29yaXRobXMgdGhhdCByZWx5IG9uIHJlcGVhdGVkIHJhbmRvbSBzYW1wbGluZyB0byBvYnRhaW4gbnVtZXJpY2FsIHJlc3VsdHMuIFRoZXkgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIHN5c3RlbXMgdG9vIGNvbXBsZXggZm9yIGFuYWx5dGljYWwgc29sdXRpb25zLiBJbiB0aGlzIGJsb2cgcG9zdCwgd2XigJlsbCBleHBsb3JlIGhvdyB0byB2aXN1YWxpemUgTW9udGUgQ2FybG8gc2ltdWxhdGlvbnMgdXNpbmcgYFJgLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBgZ2dhbmltYXRlYCwgYHRpZHl2ZXJzZWAsIGBncmlkRXh0cmFgLCBhbmQgYG1hZ2lja2AgcGFja2FnZXMuCgojIyBTZXZlcmFsIG5vdGVzOiAgCldoZW4gdXNpbmcgYGdnYW5pbWF0ZWAsIHRoZSBgZ2lmc2tpYCByZW5kZXJlciBpcyBub3QgY29uc2lzdGVudC4gSXQgbWF5IG1pc3MgZnJhbWVzIGZyb20gdG8gdGltZS4gSXQgYXBwZWFycyB0aGUgbW9zdCBjb25zaXN0ZW50IHdheSBvZiBnZW5lcmF0aW5nIGFuaW1hdGlvbiBpcyAKLSBVc2UgYHRyYW5zaXN0aW9uX21hbnVhbGAKLSBVc2UgYGZpbGVfcmVuZGVyZXJgIHRvIGdlbmVyYXRlIFBORyBmaWxlcwotIFJldmlldyBQTkcgZmlsZXMsIGVkaXQgYXMgbmVlZGVkLgotIEdlbmVyYXRlIGdpZiB3aXRoIGBtYWdpY2tgIHBhY2thZ2UuIAojIyBTZXR0aW5nIHRoZSBTY2VuZQpUbyBlbnN1cmUgcmVwcm9kdWNpYmlsaXR5LCB3ZSBzZXQgYSBzZWVkIGZvciBS4oCZcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gV2UgYWxzbyBkZWZpbmUgdGhlIHByZWNpc2lvbiBvZiBvdXIgb3V0cHV0IGZvciBjbGFyaXR5IGFuZCBjb25zaXN0ZW5jeS4KCiMjIENhc2UgU3R1ZHkgLSBUb2xlcmFuY2UgQW5hbHlzaXMuIApJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhIHN0YXRpc3RpY2FsIHRvbGVyYW5jZSBhbmFseXNpcyBvZiB0aGUgdm9sdGFnZSBkaXZpZGVyIGFzIGFuIGV4YW1wbGUuCgohW1ZvbHRhZ2UgRGl2aWRlcl0ofi9Eb3dubG9hZHMvdmRpdi5zdmcpClRoZSB2b2x0YWdlIGRpdmlzaW9uIHJhdGlvICRHID0gXGZyYWN7UjF9e1IxICsgUjJ9JCwgd2hlcmUgJFJfMSQgYW5kICRSXzIkIGFyZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgZm9sbG93aW5nIG5vcm1hbCBkaXN0cmlidXRpb25zLiBPdXIgZ29hbCBpcyB0byBzaW11bGF0ZSB0aGlzIHByb2Nlc3MgYSBtaWxsaW9uIHRpbWVzIGFuZCB2aXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBHLgoKCgpgYGB7cn0KTl9TSU0gPC0gMWU2Cm1jSGlzdCA8LSB0aWJibGUoUjEgPSBybm9ybShOX1NJTSwgMSwgMC4wNC8xMiksCiAgICAgICAgICAgICAgICBSMiA9IHJub3JtKE5fU0lNLCAxLCAwLjA0LzEyKSkgJT4lCiAgbXV0YXRlKEcgPSBSMSAvKFIxK1IyKSkgJT4lIAogIG11dGF0ZShpbmRleCA9IHJvd19udW1iZXIoKSkgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gYygiUjEiLCAiUjIiLCAiRyIpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJWYXJpYWJsZSIsIAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgCiAgbXV0YXRlKHJvdW5kID0gaWZfZWxzZShWYXJpYWJsZSA9PSAiRyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBseXI6OnJvdW5kX2FueSh2YWx1ZSwgNWUtNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx5cjo6cm91bmRfYW55KHZhbHVlLCAxZS0zKSkpCgoKYGBgCiMgQ3JlYXRlIEZyZXF1ZW5jeSBUYWJsZQoKYGBge3J9CmNvdW50X2J5X3JvdW5kIDwtbWNIaXN0ICU+JQogIHNlbGVjdChWYXJpYWJsZSwgcm91bmQpICU+JQogIGdyb3VwX2J5KFZhcmlhYmxlLCByb3VuZCkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIHVuZ3JvdXAoKQoKZ3Bsb3QgPC0gY291bnRfYnlfcm91bmQgJT4lCiAgZmlsdGVyKFZhcmlhYmxlID09ICJHIikgJT4lIAogIGdncGxvdChhZXMocm91bmQsIG4pKSArCiAgZmFjZXRfZ3JpZCh+VmFyaWFibGUpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9ImJsYWNrIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjQ5LCBjb2xvcj0iYmx1ZSIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41MSwgY29sb3I9ImJsdWUiKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBoanVzdCA9IDAuMSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsIHZqdXN0PS41LCBoanVzdD0xKSkKCnJwbG90IDwtIGNvdW50X2J5X3JvdW5kICU+JQogIGZpbHRlcihWYXJpYWJsZSAhPSAiRyIpICU+JSAKICBnZ3Bsb3QoYWVzKHJvdW5kLCBuKSkgKwogIGZhY2V0X2dyaWQoflZhcmlhYmxlKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yPSJibGFjayIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC45OCwgY29sb3I9ImJsdWUiKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEuMDIsIGNvbG9yPSJibHVlIikgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgaGp1c3QgPSAwLjEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCB2anVzdD0uNSwgaGp1c3Q9MSkpCmBgYApDb21iaW5lIFBsb3RzCmBgYHtyfQojIENvbWJpbmUgcGxvdHMKcGxvdCA9IGdyaWQuYXJyYW5nZShycGxvdCwgZ3Bsb3QsIG5yb3cgPSAyKQpgYGAKYGBge3J9CiMgYWx0ZXJuYXRpdmVseSwgdXNlIGdlb21fYmFyIHRvIGdlbmVyYXRlIGhpc3RvZ3JhbSBmcm9tIHJhdyBkYXRhCmdnIDwtIG1jSGlzdCAlPiUKICBmaWx0ZXIoVmFyaWFibGUgPT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm91bmQpKSArIAogIGdlb21fYmFyKGNvbG9yPSJibGFjayIsIHN0YXQgPSAiY291bnQiLCBhbHBoYSA9IC4zLCBmaWxsID0gInRyYW5zcGFyZW50IikgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkZyZXF1ZW5jeSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBoanVzdCA9IDAuMSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjQ5LCBjb2xvcj0iYmx1ZSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41MSwgY29sb3I9ImJsdWUiKQoKZ2cKYGBgCgojIyBBbmltYXRpbmcgdGhlIFNpbXVsYXRpb24KCkFuaW1hdGlvbnMgY2FuIHByb3ZpZGUgYSBkeW5hbWljIHZpZXcgb2YgdGhlIHNpbXVsYXRpb24gcHJvY2Vzcy4gSGVyZSwgd2XigJlsbCBjcmVhdGUgc2V2ZXJhbCBhbmltYXRpb25zIHRvIGlsbHVzdHJhdGUgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIE1vbnRlIENhcmxvIHNpbXVsYXRpb24uClByZXBhcmF0aW9uClNsaWNlIHRoZSBzaW11bGF0ZWQgZGF0YSBpbnRvIChOX0ZyYW1lcyDigJQgMSkgc2xpY2VzLCB3aGVyZSB0aGUgZmlyc3QgZnJhbWUgaGFzIHplcm8gc2ltdWxhdGlvbnMuCgoKYGBge3J9CiMgY29uc3RhbnRzIGZvciBhbmltYXRpb24KRlBTID0gMTAKTl9GUkFNRSA9IDIwMQpgYGAKCgpgYGB7cn0KY291bnRfYnlfaW5kZXggPC0gZnVuY3Rpb24obWNIaXN0LCBuZnJhbWVzPTEyMCkgewogICMgSW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGVzCiAgZGF0YSA8LSB0aWJibGUoaWR4ID0gaW50ZWdlcigpLAogICAgICAgICAgICAgICAgIG5fc2FtcGxlID0gaW50ZWdlcigpLAogICAgICAgICAgICAgICAgIFZhcmlhYmxlID0gY2hhcmFjdGVyKCksCiAgICAgICAgICAgICAgICAgcm91bmQgPSBudW1lcmljKCksCiAgICAgICAgICAgICAgICAgbiA9IGludGVnZXIoKSkKICBOX1NJTSA9IG1heChtY0hpc3QkaW5kZXgpCiAgc3RlcCA8LSBmbG9vcihOX1NJTSAvIChuZnJhbWVzLTEpKQogIGRhdGEgPC0gZGF0YSAlPiUgCiAgICBhZGRfcm93KHRpYmJsZShpZHggPSAxLAogICAgICAgICAgICAgICAgIG5fc2FtcGxlID0gMCwKICAgICAgICAgICAgICAgICBWYXJpYWJsZSA9IGMoIkciLCJSMSIsICJSMiIpLAogICAgICAgICAgICAgICAgIHJvdW5kID0gYygwLjUsIDEuMCwgMS4wKSwKICAgICAgICAgICAgICAgICBuID0gMCkpCgogIGZvciAoaSBpbiAxOm5mcmFtZXMtMSkgewogICAgIyBEYXRhIG1hbmlwdWxhdGlvbiBhbmQgc3VtbWFyaXphdGlvbiBzdGVwcwogICAgcm93IDwtIG1jSGlzdCAlPiUKICAgICAgICAgICBzZWxlY3QoaW5kZXgsIFZhcmlhYmxlLCByb3VuZCkgJT4lCiAgICAgICAgICAgZmlsdGVyKGluZGV4IDw9IHN0ZXAgKiBpKSAlPiUKICAgICAgICAgICBncm91cF9ieShWYXJpYWJsZSwgcm91bmQpICU+JQogICAgICAgICAgIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICAgICAgICAgICBtdXRhdGUoaWR4ID0gaSArIDEsCiAgICAgICAgICAgICAgICAgIG5fc2FtcGxlID0gZmxvb3Ioc3RlcCAqIGkpKQogICAgIyBBcHBlbmQgdGhlIHN1bW1hcnkgZGF0YSB0byB0aGUgbWFpbiBkYXRhIGZyYW1lCiAgICBkYXRhIDwtIGRhdGEgJT4lCiAgICAgICAgICAgIGFkZF9yb3cocm93KQogIH0KICByZXR1cm4oZGF0YSkKfQpgYGAKYGBge3J9Cmhpc3RfYW5pbV9kYXRhIDwtIGNvdW50X2J5X2luZGV4KG1jSGlzdCwgTl9GUkFNRSkgJT4lIAogIGFycmFuZ2UoaWR4KQpgYGAKCgojIyBDcmVhdGUgVGV4dCBmb3IgRyBhbmQgUgpJbiB0aGlzIHNlY3Rpb24sIHdlIHdpbGwgY3JlYXRlIGEgdGV4dCBnaWYgdG8gZGVtb25zdHJhdGUgdGhlIGNvbmNlcHQgb2YgYSB0cmFuc2ZlciBmdW5jdGlvbiwgd2hpY2ggdGFrZXMgdmFsdWVzIG9mIHggdG8gZ2VuZXJhdGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgb2YgeS4KCmBgYHtyfQp0ZXh0cGxvdF9kYXRhIDwtIG1jSGlzdCAlPiUgCiAgZmlsdGVyKGluZGV4PD01KSAlPiUgCiAgYXJyYW5nZShpbmRleCwgVmFyaWFibGUpCiMgZG90IHBsb3QgZm9yIGZpcnN0IDUgc2FtcGxlcyAKdGdwbG90IDwtIHRleHRwbG90X2RhdGEgJT4lCiAgZmlsdGVyKFZhcmlhYmxlID09ICJHIikgJT4lCiAgZ2dwbG90KGFlcyhncm91cCA9IGluZGV4LCB4ID0gcm91bmQpKSArICMgZ3JvdXAgYnkgaW5kZXggaXMgaW1wb3J0YW50CiAgZmFjZXRfZ3JpZCh+VmFyaWFibGUpICsKICBnZW9tX3BvaW50KGFlcyh5PTApLCBzaXplID0gNSwgY29sb3I9ImJsYWNrIikgKyAKICBnZW9tX3RleHQoYWVzKHg9MC41LCB5PTAuMSwgbGFiZWwgPSByb3VuZCksIAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCBjb2xvcj0iYmx1ZSIsIHNpemUgPSAxMCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkZyZXF1ZW5jeSIpICsKICB4bGltKDAuNDksIDAuNTEpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGhqdXN0ID0gMC4xKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSAKCnRycGxvdCA8LSB0ZXh0cGxvdF9kYXRhICU+JQogIGZpbHRlcihWYXJpYWJsZSAhPSAiRyIpICU+JQogIGdncGxvdChhZXMoZ3JvdXAgPSBpbmRleCwgeCA9IHJvdW5kKSkgKyAjIGdyb3VwIGJ5IGluZGV4IGlzIGltcG9ydGFudAogIGZhY2V0X2dyaWQoflZhcmlhYmxlKSArCiAgZ2VvbV9wb2ludChhZXMoeT0wKSwgc2l6ZSA9IDUsIGNvbG9yPSJibGFjayIpICsgCiAgZ2VvbV90ZXh0KGFlcyh4PTEsIHk9MC4xLCBsYWJlbCA9IHJvdW5kKSwgCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIGNvbG9yPSJibHVlIiwgc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiRnJlcXVlbmN5IikgKwogICAgeGxpbSgwLjk4LCAxLjAyKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKAogICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgaGp1c3QgPSAwLjEpLAogICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKQogICAgKQoKYGBgCiMjIyBDcmVhdGUgR0lGClVzZSBgdHJhbnNpdGlvbl9tYW51YWwoZnJhbWVzID0gaW5kZXgpIGAgYWxsIHRocm91Z2ggdG8gYXZvaWQgZnJhbWVzIG1pc2FsaWdubWVudCB3aGVuIHVzaW5nIGB0cmFuc2l0aW9uX3N0YXRlcyhzdGF0ZXMgPSBUaW1lKWAKCgpgYGB7cn0KIyBDcmVhdGUgR0lGCnJfYW5pbSA8LSB0cnBsb3QgKyB0cmFuc2l0aW9uX21hbnVhbChmcmFtZXMgPSBpbmRleCkgCnJnaWYgPC0gYW5pbWF0ZShyX2FuaW0sCiAgICAgICAgICAgICAgICB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gMzAwLAogICAgICAgICAgICAgICAgbmZyYW1lcyA9IDUsIAogICAgICAgICAgICAgICAgZnBzID0gMi41LAogICAgICAgICAgICAgICAgI3JlbmRlcmVyID0gbWFnaWNrX3JlbmRlcmVyKCkKICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gZ2lmc2tpX3JlbmRlcmVyKCIuL2FuaW0vdHIuZ2lmIikKICAgICAgICAgICAgICAgICMgcmVuZGVyZXIgPSBmaWxlX3JlbmRlcmVyKCIuL2ZyYW1lcyIsIHByZWZpeCA9ICJ0ciIpCiAgICAgICAgICAgICAgICApCgpnX2FuaW0gPC0gdGdwbG90ICsgdHJhbnNpdGlvbl9tYW51YWwoZnJhbWVzID0gaW5kZXgpCmdnaWYgPC0gYW5pbWF0ZShnX2FuaW0sCiAgICAgICAgICAgICAgICB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gMzAwLAogICAgICAgICAgICAgICAgbmZyYW1lcyA9IDUsCiAgICAgICAgICAgICAgICBmcHMgPSAyLjUsCiAgICAgICAgICAgICAgICByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigiLi9hbmltL3RnLmdpZiIpCiAgICAgICAgICAgICAgICAjIHJlbmRlcmVyID0gbWFnaWNrX3JlbmRlcmVyKCkKICAgICAgICAgICAgICAgICMgcmVuZGVyZXIgPSBmaWxlX3JlbmRlcmVyKCIuL2ZyYW1lcyIsIHByZWZpeCA9ICJ0ZyIpCiAgICAgICAgICAgICAgICApCmBgYApDb21iaW5lIDIgZ2lmcwpgYGB7cn0Kc3RhY2syZ2lmIDwtIGZ1bmN0aW9uKGdpZjEsIGdpZjIsIG5fZnJhbWVzKXsKICAjIHJlYWQgZ2lmIGFzIGltYWdlY2sgZm9ybWF0IAogIGFfbWdpZiA8LSBpbWFnZV9yZWFkKGdpZjEpIAogIGJfbWdpZiA8LSBpbWFnZV9yZWFkKGdpZjIpCiAgbmV3X2dpZiA8LSBpbWFnZV9hcHBlbmQoYyhhX21naWZbMV0sIGJfbWdpZlsxXSksIHN0YWNrID0gVFJVRSkKICBmb3IoaSBpbiAyOm5fZnJhbWVzKSB7CiAgICBjb21iaW5lZCA8LSBpbWFnZV9hcHBlbmQoYyhhX21naWZbaV0sIGJfbWdpZltpXSksIHN0YWNrID0gVFJVRSkKICAgIG5ld19naWYgPC0gYyhuZXdfZ2lmLCBjb21iaW5lZCkKICAgIH0KcmV0dXJuKG5ld19naWYpICAKCmFfbWdpZiA8LSBpbWFnZV9yZWFkKHJnaWYpCmJfbWdpZiA8LSBpbWFnZV9yZWFkKGdnaWYpCm5ld19naWYgPC0gaW1hZ2VfYXBwZW5kKGMoYV9tZ2lmWzFdLCBiX21naWZbMV0pLCBzdGFjayA9IFRSVUUpCmZvcihpIGluIDI6NSkgewogIGNvbWJpbmVkIDwtIGltYWdlX2FwcGVuZChjKGFfbWdpZltpXSwgYl9tZ2lmW2ldKSwgc3RhY2sgPSBUUlVFKQogIG5ld19naWYgPC0gYyhuZXdfZ2lmLCBjb21iaW5lZCkKfQphbmltX3NhdmUoIi4vYW5pbS81ZG90cy5naWYiLCBuZXdfZ2lmKQoKfQpgYGAKVGhlIGNyZWF0ZWQgZ2lmOgohW2FuaW1hdGVkIGRvdF0oYW5pbS81ZG90cy5naWYpCgojIENyZWF0ZSBkb3QgaGlzdG9ncmFtCgpJbiB0aGlzIHNlY3Rpb24sIHdlIGNyZWF0ZSBhIGhpc3RvZ3JhbSBnaWYsIHdoZXJlIGVhY2ggZG90IHJlcHJlc2VudCBvbmUgZGF0YSBwb2ludC4gCgoKYGBge3J9CmZpcnN0X24gPSAxMDAKCmNvdW50X2RhdGFfbiA8LSBtY0hpc3QgJT4lIAogIGZpbHRlcihpbmRleCA8PSBmaXJzdF9uKSAlPiUgCiAgYXJyYW5nZShpbmRleCwgVmFyaWFibGUpICU+JSAKICBncm91cF9ieShWYXJpYWJsZSwgcm91bmQpICU+JSAKICBtdXRhdGUoeSA9IHNlcV9hbG9uZyhyb3VuZCkpCgpmZ19wbG90IDwtIGNvdW50X2RhdGFfbiAlPiUKICBmaWx0ZXIoVmFyaWFibGUgPT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKGdyb3VwID0gaW5kZXgsIHJvdW5kLCB5KSkgKyAjIGdyb3VwIGJ5IGluZGV4IGlzIGltcG9ydGFudAogIGZhY2V0X2dyaWQoflZhcmlhYmxlKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkZyZXF1ZW5jeSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMiwgaGp1c3QgPSAwLjEpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkKICApCgpwbG90MmZyYW1lcyA8LSBmdW5jdGlvbihwbG90LCAKICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCAKICAgICAgICAgICAgICAgICAgICAgdyA9IDgwMCwgaCA9IDMwMCwKICAgICAgICAgICAgICAgICAgICAgcGF0aF9mcmFtZXMgPSAiLi9mcmFtZXMiCiAgICAgICAgICAgICAgICAgICAgICl7CiAgYW5pbSA8LSBwbG90ICsgdHJhbnNpdGlvbl9tYW51YWwoaW5kZXgsIGN1bXVsYXRpdmUgPSBUUlVFKQogIGdpZiA8LSBhbmltYXRlKAogICAgYW5pbSwKICAgIHdpZHRoID0gdywKICAgIGhlaWdodCA9IGgsCiAgICByZW5kZXJlciA9IGZpbGVfcmVuZGVyZXIocGF0aF9mcmFtZXMsIHByZWZpeCA9IHByZWZpeCkKICApCiAgcmV0dXJuKGdpZikKfSAKCgpmZ19hbmltIDwtIHBsb3QyZnJhbWVzKGZnX3Bsb3QsIHByZWZpeCA9ICJnZG90IikKCmZyX3Bsb3QgPC0gY291bnRfZGF0YV9uICU+JQogIGZpbHRlcihWYXJpYWJsZSAhPSAiRyIpICU+JQogIGdncGxvdChhZXMoZ3JvdXAgPSBpbmRleCwgcm91bmQsIHkpKSArICMgZ3JvdXAgYnkgaW5kZXggaXMgaW1wb3J0YW50CiAgZmFjZXRfZ3JpZCh+VmFyaWFibGUpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMyLCBoanVzdCA9IDAuMSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKQogICkKCgpmZ19hbmltIDwtIHBsb3QyZnJhbWVzKGZnX3Bsb3QsIHByZWZpeCA9ICJnZG90IikKZnJfYW5pbSA8LSBwbG90MmZyYW1lcyhmcl9wbG90LCBwcmVmaXggPSAicmRvdCIpCgpmbl9naWYgPC0gc3RhY2syZ2lmKGZyX2FuaW0sIGZnX2FuaW0sIGZpcnN0X24pICU+JSAKICBpbWFnZV9hbmltYXRlKAogICAgZnBzID0gRlBTLAogICAgbG9vcCA9IDAsCiAgKQoKYW5pbV9zYXZlKCIuL2FuaW0vZm4uZ2lmIiwgZm5fZ2lmKQpgYGAKVGhpcyBnaWYgc2hvd3MgaG93IGZpcnN0IE4gc2ltdWxhdGlvbiBhY2N1bWF0ZWQgdG8gZm9ybSB0aGUgaGlzdG9yZ3JhbS4gCiFbZmlyc3QgTl0oYW5pbS9mbi5naWYpCgoKIyMgSGlzdG9yZ3JhbSBiYXIgZ2lmCgpgYGB7cn0KZ3Bsb3QgPC0KICBoaXN0X2FuaW1fZGF0YSAlPiUKICBmaWx0ZXIoVmFyaWFibGUgPT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKGdyb3VwID0gaWR4LCByb3VuZCwgbikpICsgIyBncm91cCBieSBpbmRleCBpcyBpbXBvcnRhbnQKICBmYWNldF9ncmlkKH5WYXJpYWJsZSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC40OSwgY29sb3I9ImJsdWUiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41MSwgY29sb3I9ImJsdWUiKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzIsIGhqdXN0ID0gMC4xKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAzMiwgaGp1c3QgPSAwLjEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQoKc3RlcCA8LSBOX1NJTSAvIChOX0ZSQU1FIC0gMSkKZ2Jhcl9hbmltIDwtIGdwbG90ICsgCiAgICBnZ3RpdGxlKCd7Zm9ybWF0KGZsb29yKChmcmFtZSAtIDEpICogc3RlcCksIHNjaWVudGlmaWMgPSBGQUxTRSwgYmlnLm1hcmsgPSAiLCIgKX0gU2FtcGxlcyBHZW5lcmF0ZWQnKSArIAogIHRyYW5zaXRpb25fbWFudWFsKGZyYW1lcyA9IGlkeCkKZ2Jhcl9naWYgPC0gYW5pbWF0ZShnYmFyX2FuaW0sCiAgICAgICAgICAgICAgICAgICAgbmZyYW1lcyA9IE5fRlJBTUUsCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA4MDAsIGhlaWdodCA9IDMwMCwKICAgICAgICAgICAgICAgICAgICAjIGZwcyA9IEZQUywKICAgICAgICAgICAgICAgICAgICAjIHJlbmRlcmVyID0gZ2lmc2tpX3JlbmRlcmVyKCIuL2FuaW0vZ2Jhci5naWYiKSwKICAgICAgICAgICAgICAgICAgICAjIHJlbmRlcmVyID0gbWFnaWNrX3JlbmRlcmVyKCkKICAgICAgICAgICAgICAgICAgICByZW5kZXJlciA9IGZpbGVfcmVuZGVyZXIoIi4vZnJhbWVzIiwgcHJlZml4ID0gImdiYXIiKQopCiMgYW5pbV9zYXZlKCIuL2FuaW0vZ2Jhci5naWYiLCBnYmFyX2dpZikKIyMjIEZvciBSMSBhbmQgUjIKcnBsb3QgPC0KICBoaXN0X2FuaW1fZGF0YSAlPiUKICBmaWx0ZXIoVmFyaWFibGUgIT0gIkciKSAlPiUKICBnZ3Bsb3QoYWVzKGdyb3VwID0gaWR4LCByb3VuZCwgbikpICsgIyBncm91cCBieSBpbmRleCBpcyBpbXBvcnRhbnQKICBmYWNldF9ncmlkKH5WYXJpYWJsZSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC45OCwgY29sb3I9ImJsdWUiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMS4wMiwgY29sb3I9ImJsdWUiKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzIsIGhqdXN0ID0gMC4xKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkKCnJiYXJfYW5pbSA8LSBycGxvdCArIHRyYW5zaXRpb25fbWFudWFsKGZyYW1lcyA9IGlkeCkKcmJhcl9naWYgPC0gYW5pbWF0ZShyYmFyX2FuaW0sCiAgICAgICAgICAgICAgICAgICAgbmZyYW1lcyA9IE5fRlJBTUUsCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSA4MDAsIGhlaWdodCA9IDMwMCwKICAgICAgICAgICAgICAgICAgICAjIGZwcyA9IEZQUywKICAgICAgICAgICAgICAgICAgICAjIHJlbmRlcmVyID0gZ2lmc2tpX3JlbmRlcmVyKCIuL2FuaW0vcmJhci5naWYiKQogICAgICAgICAgICAgICAgICAgICMgcmVuZGVyZXIgPSBtYWdpY2tfcmVuZGVyZXIoKQogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gZmlsZV9yZW5kZXJlcigiLi9mcmFtZXMiLCBwcmVmaXggPSAicmJhciIpCiAgICAgICAgICAgICAgICAgICAgKQoKYGBgCgoKCkNvbWJpbmUgMiBnaWZzCmBgYHtyfQphX21naWYgPC0gaW1hZ2VfcmVhZChyYmFyX2dpZikKYl9tZ2lmIDwtIGltYWdlX3JlYWQoZ2Jhcl9naWYpCiMgY19tZ2lmIDwtIGltYWdlX3JlYWQoY291bnRlcl9naWYpCgpuZXdfZ2lmIDwtIGltYWdlX2FwcGVuZChjKGFfbWdpZlsxXSwgYl9tZ2lmWzFdKSwgc3RhY2sgPSBUUlVFKQpmb3IoaSBpbiAyOk5fRlJBTUUpIHsKICBjb21iaW5lZCA8LSBpbWFnZV9hcHBlbmQoYyhhX21naWZbaV0sIGJfbWdpZltpXSksIHN0YWNrID0gVFJVRSkKICBuZXdfZ2lmIDwtIGMobmV3X2dpZiwgY29tYmluZWQpCn0KbmV3X2dpZiA8LSBuZXdfZ2lmICU+JSAKICBpbWFnZV9hbmltYXRlKAogICAgZnBzID0gRlBTLAogICAgbG9vcCA9IDAsCiAgKQoKYW5pbV9zYXZlKCIuL2FuaW0vYmFyLmdpZiIsIG5ld19naWYpCmBgYAoKV2UgY2hlY2sgdGhlIGdlbmVyYXRlZCBnaWY6CiFbQW5pbWF0ZWQgQmFyXShhbmltL2Jhci5naWYpCgoKIyMgUmVmZXJlbmNlCi0gW1JvaCdzIEFuaW1hdGlvbiwgd2l0aG91dCB1c2luZyBgZ2dhbmltYXRlYF0oaHR0cHM6Ly9yb2guZW5naW5lZXJpbmcvcG9zdHMvMjAxOC8wNS9hbmltYXRpbmctYS1tb250ZS1jYXJsby1zaW11bGF0aW9uLykKLSBbU3RhY2tvdmVyZmxvdyAtIEFuaW1hdGVkIGhpc3RvZ3JhbSwgdXNpbmcgYGBnZ2FuaW1hdGVgXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MTQ0NjEwOC9hbmltYXRlZC1kb3QtaGlzdG9ncmFtLWJ1aWx0LW9ic2VydmF0aW9uLWJ5LW9ic2VydmF0aW9uLXVzaW5nLWdnYW5pbWF0ZS1pbi1yKQ==